#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
三列函数的构建要求：
所选函数尽量简单，以便提高转换效率
散列出的地址应当尽量集中，最大化利用空间
*/
// 定义一个结构体来存储学生信息
typedef struct {
    int id;           // 学号
    char name[20];    // 姓名
    int scores[5];    // 成绩数组，假设有5门课
} Student;

// 定义哈希表的节点
typedef struct node {
    Student data;     // 存储学生数据
    struct node* next; // 链表中的下一个节点
} Node;

// 定义哈希表
typedef struct {
    Node** buckets;    // 数组中存储了若干指针，每个指针存储了节点的地址。 **element == node
    int size;          // 哈希表的大小
} HashTable;

// 简单的哈希函数，使用模运算
int hash(int key, int tableSize) { //tableSize一般为质数，即只能被 1 和它本身除尽的数。
    return key % tableSize;//除留余法 key mod p = Hash(key)
}
// 插入一个学生到哈希表中
void insertStudent(HashTable* ht, Student s) {
    int index = hash(s.id, ht->size);
    Node* newNode = (Node*) malloc(sizeof(Node));
    newNode->data = s;
    newNode->next = ht->buckets[index];
    ht->buckets[index] = newNode;
}
// 根据学号查找学生
Student* findStudent(HashTable* ht, int id) {
    int index = hash(id, ht->size);
    Node* current = ht->buckets[index];
    while (current != NULL) {
        if (current->data.id == id) {
            return &current->data;
        }
        current = current->next;
    }
    return NULL; // 如果找不到
}
// 初始化哈希表
HashTable* createHashTable(int size) {
    HashTable* ht = (HashTable*) malloc(sizeof(HashTable));
    ht->size = size;
    ht->buckets = (Node**) malloc(sizeof(Node*) * size);
    for (int i = 0; i < size; i++) {
        ht->buckets[i] = NULL;
    }
    return ht;
}
int main() {
    HashTable* ht = createHashTable(10); // 创建一个大小为10的哈希表

    // 假设我们有一个学生信息
    Student s = {179327, "张三", {82, 80, 78, 98, 84}};
    Student a = {179324, "李四", {82, 80, 78, 98, 84}};

    insertStudent(ht, s); // 插入学生信息到哈希表
    insertStudent(ht, a); // 插入学生信息到哈希表

    // 查找学生信息
    Student* found = findStudent(ht, 179324);
    if (found) {
        printf("Found: %s\n", found->name);
    } else {
        printf("Student not found.\n");
    }

    return 0;
}


